﻿using System;
using System.Web.Mvc;
using System.Web.Security;
using App.Interface;
using AutoMapper;
using Domain.Entidades;
using PagedList;
using SiteCredivale.ViewModels;

namespace SiteCredivale.Areas.Intranet.Controllers
{
    public class InicioController : Controller
    {

        //
        // GET: /Intranet/Inicio/

        private readonly IUsuarioAppService _usuarioapp;
        private readonly IAvisoAppService _avisoapp;

        public InicioController()
        {
           
         }

        public InicioController(IUsuarioAppService usuarioapp, IAvisoAppService avisoapp)
        {
            _usuarioapp = usuarioapp;
            _avisoapp = avisoapp;
        }


        public ActionResult Index()
        {
            try
            {



                if (_usuarioapp.verifica_usuario() == true)
                {
                    if (Session["nome_user"] == null)
                    {
                        VW_usuarios _usuario = _usuarioapp.GetUsuarioLogado(0);
                        Session["nome_user"] = _usuario.usu_login + " - " + _usuario.usu_nome;
                    }

                    return RedirectToAction("Home", "Inicio");
                }
                else
                {
                   
                    usuarioViewModel user = new usuarioViewModel();
                    return View(user);
                }
            }


            catch (Exception ex)
            {

                throw ex;
            }
           

          }
        [HttpPost]
        public ActionResult Index(usuarioViewModel user)
        {

            string url =null;
            if (TempData["url"] != null)
            {
                url = TempData["url"].ToString();

            }

            if (string.IsNullOrEmpty(user.Login))
            {
                ModelState.AddModelError("Login", "*O campo usuário é obrigatório");
            }

            if (string.IsNullOrEmpty(user.senha))
            {
                ModelState.AddModelError("senha", "*O campo senha é obrigatório");
            }

            if (ModelState.IsValid)
            {

                int retorno;
                retorno = _usuarioapp.autentica_usuario(Mapper.Map<usuarioViewModel, usuario_logado>(user));
              

                if (retorno == 0)
                {

                    TempData["url"] = url;
                    ViewBag.msg_Error = "O usuário ou a senha estão incorretos.";
                    return View(user);
                    
                }
                else if (retorno ==-2)
                {    
                     
                ViewBag.msg_Error = "O usuário encontra-se bloqueado ou desligado.";
                 return View(user);
                }

                if (user.senha == "vale@3209")
                {

                    TempData["senha_antiga"] = "vale@3209";
              
                    return RedirectToAction("TrocaSenha", "Inicio");
                    
                }

               
                VW_usuarios _usuario = _usuarioapp.GetUsuarioLogado(retorno);
                Session["nome_user"] = _usuario.usu_login + " - " + _usuario.usu_nome;


                if (url != null)
                {

                    return Redirect(url);

                }
                else
                {
                    TempData.Remove("url");
                    return RedirectToAction("Home", "Inicio");
                }
            }
            return View(user);

        }

        [Authorize]
        public ActionResult Home(int? page, string dt1, string dt2)
        {
            DateTime data2;
            DateTime data1;

            if (DateTime.TryParse(dt1, out data1) == false)
            {
                data1 = DateTime.Now.AddMonths(-1);
            }

            if (DateTime.TryParse(dt2, out data2) == false)
            {
                data2 = DateTime.Now;
            }

            if (data2 < data1)
            {
                ModelState.AddModelError("", "A data inicial não pode ser maior que a final");
                data1 = DateTime.Now.AddMonths(-1);
                data2 = DateTime.Now;
            }


            ViewBag.dt1 = data1.ToString();
            ViewBag.dt2 = data2.ToString();
            ViewBag.page = page ?? 1;


            const int pageSize = 10;
            var pagedavisos = _avisoapp.Listar(data1, data2,_usuarioapp.GetUsuarioLogado(0)).ToPagedList(page ?? 1, pageSize);
            return View(pagedavisos);

        }


        [HttpPost, Authorize]
        public ActionResult Home(FormCollection form)
        {


            DateTime data2;
            DateTime data1;

            if (DateTime.TryParse(form["calendario1"], out data1) == false)
            {
                data1 = DateTime.Now.AddMonths(-1);
            }

            if (DateTime.TryParse(form["calendario2"], out data2) == false)
            {
                data2 = DateTime.Now;
            }

            if (data2 < data1)
            {
                ModelState.AddModelError("", "teste");
                data1 = DateTime.Now.AddMonths(-1);
                data2 = DateTime.Now;
            }

            ViewBag.dt1 = data1.ToString();
            ViewBag.dt2 = data2.ToString();
            ViewBag.page = 1;

            const int pageSize = 10;
            var pagedavisos = _avisoapp.Listar(data1, data2, _usuarioapp.GetUsuarioLogado(0)).ToPagedList(1, pageSize);

            return View(pagedavisos);

        }


        public ActionResult Logout_sair()
        {


            Session.Abandon();
            _usuarioapp.Logout();
            return Redirect("/Intranet_");

        }

        public ActionResult Logout()
        {


            Session.Abandon();
           _usuarioapp.Logout();
            Session["sessao_ex"] = "Sua sessão expirou, faça o login novamente.";
            return Redirect("/Intranet_");

        }

        public ActionResult Sessao(string returnUrl)
        {

            TempData["url"] = returnUrl;
            string sessao_ex = "Sua sessão expirou, faça o login novamente.";
           
            _usuarioapp.Logout();

            if (TempData["arquivo_n"] != null)
            {
                sessao_ex = TempData["arquivo_n"].ToString();
            }

            if (returnUrl != null)

            {
                sessao_ex = "Você precisa estar logado para realizar esta ação.";

            }

            if (TempData["arquivo_inexistente"] != null)
            {
                sessao_ex = "Arquivo solicitado não existe.";
            }

            TempData["sessao_ex"] = sessao_ex;

            Session.Remove("nome_user");
            return View("Index");

        }

        public ActionResult TrocaSenha()
        {

            try
            {
                usuarioViewModel user = new usuarioViewModel();
                user.Login = "ok";
                if (TempData["senha_antiga"] != null)
                    user.senha_antiga = TempData["senha_antiga"].ToString();

                return View(user);

            }


            catch (Exception ex)
            {
                TempData["msg_err"] = ex.Message;
                return RedirectToAction("erro", "Home");

            }


        }

        [HttpPost, Authorize]
        public ActionResult TrocaSenha(usuarioViewModel user)
        {

            try
            {

                int caracteres = 0;
                int numeros = 0;
                bool maiuscula = false;
                bool especial = false;
                foreach (char c in user.senha)
                {


                    if (Char.IsUpper(c))
                        maiuscula = true;


                    if (char.IsNumber(c) == true)


                        numeros = numeros + 1;
                    else
                    {
                        if ((Convert.ToInt32(c) >= 65 && Convert.ToInt32(c) <= 90) || (Convert.ToInt32(c) >= 97 && Convert.ToInt32(c) <= 122))
                            caracteres = caracteres + 1;
                        else
                        {
                            especial = true;
                        }

                    }


                }

                if (caracteres < 3)
                {
                    ModelState.AddModelError("senha", "* A senha deve conter no mínimo 3 letras.");
                }


                if (numeros < 3)
                {
                    ModelState.AddModelError("senha", "* A senha deve conter no mínimo 3 caracteres numéricos.");
                }

                if (maiuscula == false)
                {

                    ModelState.AddModelError("senha", "* A senha deve conter no mínimo 1 caracter maiúscula.");
                }


                if (user.senha.Length < 8)
                {
                    ModelState.AddModelError("senha", "* A senha deve conter no mínimo 8 caracteres");
                }


                //if (especial == false)
                //{
                //    ModelState.AddModelError("senha", "* A senha deve conter caracteres especiais.");

                //}


                if (user.senha_antiga == null || user.senha_antiga == "")
                {

                    ModelState.AddModelError("senha_antiga", "* Campo deve ser preenchido");
                }

                if (_usuarioapp.Verifica_senha_antiga(user.senha_antiga) == false)
                {
                    ModelState.AddModelError("senha_antiga", "* A senha antiga esta incorreta");
                }

                if (user.senha != user.senha_novamente)
                {
                    ModelState.AddModelError("senha_novamente", "* As senhas não são a mesma");
                }


                if (ModelState.IsValid)
                {
                    _usuarioapp.troca_senha(user.senha);
                    ViewBag.res = "ok";
                    return View(user);
                }

                return View(user);

            }
            catch (Exception ex)
            {

                ViewBag.err = "Erro ao trocar a senha : " + ex.Message;
                return View(user);
            }
            finally
            {
                user = null;
            }

        }






    }


}

